﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Negocio.catalogos;
using System.Text;
using System.IO;
using Negocio;
using Negocio.clases_tontas;
namespace Presentacion.controlasistencia
{
    public partial class JustificacionEspecialAdmin : System.Web.UI.Page
    {
       
            //objetos
            /// <summary>
            /// catalogo estudiante
            /// </summary>
            catalogoEstudiante _objE = new catalogoEstudiante();
            /// <summary>
            /// catalogo cabecera asistencia
            /// </summary>
            catalogoCabeceraAsistencia _objCA = new catalogoCabeceraAsistencia();
            /// <summary>
            /// catalogo asistencia
            /// </summary>
            catalogoAsistencia _objA = new catalogoAsistencia();
            /// <summary>
            /// catalogo horario
            /// </summary>
            catalogoHorario _objH = new catalogoHorario();
            /// <summary>
            /// catalogo distribucion
            /// </summary>
            catalogoDistribucion _objD = new catalogoDistribucion();
            /// <summary>
            /// catalogo justificacion
            /// </summary>
            catalogoJustificacion _objJ = new catalogoJustificacion();
            /// <summary>
            /// catalogo Calendario Academico
            /// </summary>
            catalogoCalendarioAcademico _objCalendario = new catalogoCalendarioAcademico();
            catalogoCabecera _objC = new catalogoCabecera();
            catalogoCalendarioAcademico _objCa = new catalogoCalendarioAcademico();

            StringBuilder cod_html = new StringBuilder();
            StringBuilder cod_html2 = new StringBuilder();
            List<int> list_idAsistencias = new List<int>();
            /// <summary>
            /// Metodo Load
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void Page_Load(object sender, EventArgs e)
            {
                //string uno = (Session["idDocente"]).ToString();
                //string dos = (Session["CodCarrera"]).ToString();

                if (Session["admin"] != null || Session["vicerrectorado"] != null)
                {
                    if (!IsPostBack)
                    {
                        HTML();

                        var fechas = _objCalendario.obtenerFechasMatriculas(Convert.ToInt32(Session["periodo"]));
                        DateTime ordinariaInicio = new DateTime();
                        DateTime ordinariaFin = new DateTime();
                        DateTime extraInicio = new DateTime();
                        DateTime extraFin = new DateTime();
                        int contador = 1, ce = 0;
                        foreach (var item in fechas)
                        {
                            if (contador == 2)
                            {
                                extraInicio = Convert.ToDateTime(item.start);
                                extraFin = Convert.ToDateTime(item.end);
                            }
                            if (ce == 0)
                            {

                                ordinariaInicio = Convert.ToDateTime(item.start);
                                ordinariaFin = Convert.ToDateTime(item.end);
                                contador += 1;
                                ce += 1;
                            }
                        }
                        //DateAsisInicio.Value = (ordinariaInicio.Day + "/" + ordinariaInicio.Month + "/" + ordinariaInicio.Year);
                    }

                }
                else
                {
                    Server.Transfer("~/controlasistencia/404.aspx");
                }

            }
            /// <summary>
            /// CARGAR EL HTML DE LA PAGINA
            /// </summary>
            private void HTML()
            {

            }
            #region justificacion
            /// <summary>
            /// para buscar las faltas por fecha y cedula
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void Button1_Click(object sender, EventArgs e)
            {
                consultarInasistencias();
            }
            private void consultarInasistencias()
            {
                //
                string ced = this.txtCedula.Text.Trim(), fecInicio = this.txtFechaInicio.Value, fecFin = this.txtFechaFin.Value, msm = "Cédula o fechas incorrecta..!!", msm2 = "Ingrese la cédula";
                if (ced == "")
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msm2 + "')", true);
                }
                if (fecInicio == "" || fecFin == "")
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Debe de llenar todos los datos..!!')", true);
                }
                else
                {
                    if ((Convert.ToDateTime(fecInicio) > Convert.ToDateTime(fecFin)))
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('La fecha de inicio (Desde) no puede ser mayor a la fecha final (Hasta)..!!')", true);
                    }
                    else
                    {
                        try
                        {
                            ///tabla de datos de las inasistencias
                            cod_html.Append("<table class='table table-hover table-bordered'>");
                            var cedula = _objE.obtenerEstudianteXCED(ced).First();
                            int id_Estudiante = cedula.Id_Alumno;
                            ///tabla de datos del alumno
                            cod_html2.Append("<table class='table table-striped'>" +
                                    "<thead><tr>" +
                                   "<th lista-estudiantes-bolder>NOMBRES Y PELLIDOS:</th>" +
                                   "</tr>" +
                                "</thead>" +
                                "<tbody>" +
                                    "<tr>" +
                                        "<td class='lista-estudiantes'>" + cedula.Nombres + "</tr>" +
                                    "<tr>" +
                                        "<th lista-estudiantes-bolder>SEMESTRE:</th>" +
                                    "</tr>" +
                                    "<tr>" +
                                        "<td class='lista-estudiantes'>" + cedula.Semestre + "</tr>" +
                                    "<tr>" +
                                        "<th lista-estudiantes-bolder>CARRERA:</th>" +
                                    "</tr>" +
                                    "<tr>" +
                                        "<td class='lista-estudiantes'>" + cedula.Carrera + "</tr></tbody>" +
                                "</table>");
                            cod_html.Append("<thead><tr><th>Materia</th><th>Fecha/dias faltados</th><th>Horas</th></tr></thead>");
                            //var cabecera = _objCA.obtenerCabeceraAsistenciaXIDEstudiante(id_Estudiante);
                            var inasistencias = _objA.obtenerAsistenciaxIDCabeceraANDidEstudianteANDFecha(id_Estudiante, fecInicio, fecFin);

                            var resultDistribuciones = inasistencias.GroupBy(C => C.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion).Select(g => g.First()).ToList();

                            //int temporal = 0;

                            if (inasistencias.Count() > 0)
                            {
                                foreach (var itemDistribucion in resultDistribuciones)
                                {
                                    
                                    if (tipoJustificacion.Value == "2")
                                    {
                                        
                                        cod_html.Append("<tr><td>" + itemDistribucion.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.Nombre + "</td><td>" + itemDistribucion.fecha.ToShortDateString() + "</td><td>" + inasistencias.Where(E => E.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion == itemDistribucion.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion).Count() + "</td></tr></tbody>");

                                    }
                                    else
                                    {
                                        DateTime compara = new DateTime();
                                        if (itemDistribucion.fecha.DayOfWeek == DayOfWeek.Thursday || itemDistribucion.fecha.DayOfWeek == DayOfWeek.Friday)
                                        {
                                            compara = itemDistribucion.fecha.AddDays(5);
                                        }
                                        else
                                        {
                                            compara = itemDistribucion.fecha.AddDays(4);
                                        }

                                        if (itemDistribucion.fecha > compara)
                                        {
                                            cod_html.Clear();
                                            cod_html.Append("<table class='table table-hover table-bordered'><thead><tr><th>No posee inasistencias</th></tr></thead></table>");
                                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('El tiempo para una justificacion normal ha expirado')", true);
                                        }
                                        else
                                        {

                                            
                                            cod_html.Append("<tr><td>" + itemDistribucion.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.Nombre + "</td><td>" + itemDistribucion.fecha.ToShortDateString() + "</td><td>" + inasistencias.Where(E => E.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion == itemDistribucion.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion).Count() + "</td></tr></tbody>");

                                        }
                                        //}
                                    }
                                }
                                cod_html.Append("</table><div align='right'><button class='btn btn-green' type='button' onclick='callModal2();'" +
                                                                "data-toggle='modal' data-target='#popup'>Justificar asistencias!</button></div>");
                            }
                            else
                            {
                                cod_html.Clear();
                                cod_html.Append("<table class='table table-hover table-bordered'><thead><tr><th>No posee inasistencias</th></tr></thead></table>");
                            }
                        }
                        catch (Exception)
                        {
                            cod_html.Clear();
                            cod_html.Append("");//<table class='table table-hover table-bordered'><thead><tr><th>No posee inasistencias</th></tr></thead></table>
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msm + "')", true);
                        }
                        datos_alumno.InnerHtml = cod_html2.ToString();
                        datos_faltas.InnerHtml = cod_html.ToString();
                    }
                }


            }
            protected void Button3_Click(object sender, EventArgs e)
            {
                ClientScript.RegisterStartupScript(GetType(), "jsOcultaPanel", "javascript:callModal()", true);
            }
            /// <summary>
            /// para cargar el archivo de pdf de la jusstificacion y guardar
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void Button2_Click(object sender, EventArgs e)
            {
                string error = "Asistencia NO justificada, problema se puede presentar debido a que las fechas no poseen el orden correcto.";
                try
                {
                    actualizarFaltas();
                    subirArchivo();
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('Asistencia justificada correctamente')", true);
                }
                catch (Exception ex)
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + error + "/" + ex.Message + "')", true);

                }
            }
            /// <summary>
            /// sube el archivo pdf a la ruta especificada
            /// </summary>
            public void subirArchivo()
            {
                //mensajes 
                //var msmOK = "Archivo cargado exitosamente.";
                var msmFall = "Archivo no cargado.";
                var msmTipo = "No se ha cargado ningun archivo, unicamente archivos con extencion (.pdf)  ";
                //para verificar el estado del archivo
                Boolean fileOK = false;
                //para indicar la ruta en la q se guardara
                String path = Server.MapPath("~/controlasistencia/archivo_justificacion/");
                if (Directory.Exists(path))
                {
                    //verifica si el control posee un archivo
                    if (file.HasFile && textObservacion.Value != "")
                    {
                        //obtengo la extension del archivo
                        String fileExtension = Path.GetExtension(file.FileName).ToLower();
                        //declaro las extensiones permitidas
                        String[] allowedExtensions = { ".pdf" };
                        //compruebo el archivo de entre las extensiones permitidas
                        for (int i = 0; i < allowedExtensions.Length; i++)
                        {
                            if (fileExtension == allowedExtensions[i])
                            {
                                fileOK = true;
                            }
                        }
                    }
                    if (fileOK)
                    {
                        try
                        {
                            string nombre_Archivo = Path.GetRandomFileName();
                            //guarda el archivo en la ruta especificada
                            file.PostedFile.SaveAs(path + nombre_Archivo + ".pdf");
                            // envio la ruta en donde se guardara la justificacion en conjunto con la observacion de la misma
                            guardarJustificacion(nombre_Archivo + ".pdf");
                            //ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('"+msmOK+"')", true); 
                        }
                        catch (Exception e)
                        {
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msmFall + "')", true);
                            throw e;
                        }
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msmTipo + "')", true);
                    }
                }
                else
                {
                    Directory.CreateDirectory(path);
                    //verifica si el control posee un archivo
                    if (file.HasFile && textObservacion.Value != "")
                    {
                        //obtengo la extension del archivo
                        String fileExtension = Path.GetExtension(file.FileName).ToLower();
                        //declaro las extensiones permitidas
                        String[] allowedExtensions = { ".pdf" };
                        //compruebo el archivo de entre las extensiones permitidas
                        for (int i = 0; i < allowedExtensions.Length; i++)
                        {
                            if (fileExtension == allowedExtensions[i])
                            {
                                fileOK = true;
                            }
                        }
                    }
                    if (fileOK)
                    {
                        try
                        {
                            string nombre_Archivo = Path.GetRandomFileName();
                            //guarda el archivo en la ruta especificada
                            file.PostedFile.SaveAs(path + nombre_Archivo + ".pdf");
                            // envio la ruta en donde se guardara la justificacion en conjunto con la observacion de la misma
                            guardarJustificacion(nombre_Archivo + ".pdf");
                            //ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('"+msmOK+"')", true); 
                        }
                        catch (Exception e)
                        {
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msmFall + "')", true);
                            throw e;
                        }
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msmTipo + "')", true);
                    }
                }


            }
            /// <summary>
            /// Guarda el detalle de la justificacion con los respectivos documentos y observaciones
            /// </summary>
            /// <param name="_path"></param>
            private void guardarJustificacion(string _path)
            {
                try
                {
                    foreach (var item in list_idAsistencias)
                    {
                        _objJ.insertarJustificacion(Convert.ToInt32(tipoJustificacion.Value), Convert.ToInt32(Session["cedula"]), textObservacion.Value, _path, item, DateTime.Now);
                    }
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
            /// <summary>
            /// guarda los datos de las inasistencias justificadas
            /// </summary>
            private void actualizarFaltas()
            {
                string ced = this.txtCedula.Text.Trim(), fecInicio = this.txtFechaInicio.Value, fecFin = this.txtFechaFin.Value, msm = "Cédula o fechas incorrecta..!!";

                if (ced == "" || fecInicio == null || fecFin == null)
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msm + "')", true);
                }
                if ((Convert.ToDateTime(fecInicio) > Convert.ToDateTime(fecFin)))
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('La fecha de inicio (Desde) no puede ser mayor a la fecha final (Hasta)..!!');", true);
                }
                else
                {
                    try
                    {
                        if (textObservacion.Value == "" || !file.HasFile)
                        {
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Debe de ingresar la observacion de la justificacion');", true);
                        }
                        else
                        {
                            var cedula = _objE.obtenerEstudianteXCED(ced).First();
                            int id_Estudiante = cedula.Id_Alumno;
                            var inasistencias = _objA.obtenerAsistenciaxIDCabeceraANDidEstudianteANDFecha(id_Estudiante, fecInicio, fecFin);
                            if (inasistencias.Count() > 0)
                            {
                                foreach (var item in inasistencias)
                                {
                                    list_idAsistencias.Add(item.idAsistencia);
                                    //el 15 es por el tipo de asistencias especial de la tabla de tipo de asistencias
                                    _objA.modificarAsistenciaXIdAsistencia(Convert.ToInt32(item.idAsistencia), 15, 211046);
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Error en el servidor')", true);

                    }
                }
            }
        #endregion
    }
}